[官方文档翻译]Mac使用VS Code配置C++编译和调试环境

您所在的位置:网站首页 mac配置vscode c语言 [官方文档翻译]Mac使用VS Code配置C++编译和调试环境

[官方文档翻译]Mac使用VS Code配置C++编译和调试环境

2023-07-30 12:34| 来源: 网络整理| 查看: 265

Mac使用VS Code配置C++编译和调试环境

这是一篇翻译稿,原文为VSCode官方Docs。

文章目录 Mac使用VS Code配置C++编译和调试环境Prerequisites确保安装了Clang创建 Hello World添加hello world源码文件探索 IntelliSense 构建 helloworld.cpp编译程序改进 tasks.json 调试 helloworld.cpp开始调试跨步调试设置一个监视器(WATCH) 配置C/C++可能出现的问题 在这个教程中,你将学会如何在macOS环境下配置VS Code来使用clang/LLVM编译器和调试器。

Prerequisites

在开始这个教程之前,你需要先安装好:

MacOS 版的Visual Studio Code;VSCode C++ 插件:在插件栏搜索 “C++”(或者使用快捷键⇧+⌘+X),安装如下插件: 在这里插入图片描述 确保安装了Clang

通常来讲,Mac上已经安装好了clang。可以通过检查clang版本的方式来查看clang是否安装:

clang --version

如果没有出现以下输出:

clang version 10.0.1 Target: x86_64-apple-darwin19.6.0 Thread model: posix InstalledDir: /opt/anaconda3/envs/root_env/bin

那么考虑重新安装clang。可以通过以下命令来安装命令行工具(command line develop tools):

xcode-select --install 创建 Hello World

在终端创建一个用来存放所有项目文件的空文件夹,名为project。然后在这个文件夹中创建一个子文件夹,命名为helloworld,然后在这个子文件夹中打开VS Code。

mkdir project cd project mkdir helloworld cd helloworld code .

code . —— 在当前文件夹下打开VS Code,并且当前的文件夹成为默认工作空间(workspace)。在接下来的教程中,我们将会在这个工作空间的.vscode(自动创建的文件夹) 文件夹中创建如下的3个文件:

tasks.json : 编译器编译的设置文件launch.json : 调试器设置文件c_cpp_properties.json : 编译器路径以及IntelliSense设置

如果提示code命令未安装,则手动打开vscode进行安装: 使用 command + shift + p (注意window 下使用 ctrl + shift + p ) 然后搜索code,选择 install ‘code’ command in path。

添加hello world源码文件

在File Explorer中新建一个helloworld.cpp: 在这里插入图片描述 并在新创建的文件中粘贴如下代码:

#include #include #include using namespace std; int main() { vector msg {"Hello", "C++", "World", "from", "VS Code", "and the C++ extension!"}; for (const string& word : msg) { cout "type": "shell", "label": "clang++ build active file", "command": "/usr/bin/clang++", "args": [ "-std=c++17", "-stdlib=libc++", "-g", "${file}", "-o", "${fileDirname}/${fileBasenameNoExtension}" ], "options": { "cwd": "${workspaceFolder}" }, "problemMatcher": ["$gcc"], "group": { "kind": "build", "isDefault": true } } ] }

上面的文件和默认的tasks.json的主要区别在以下两个位置:

"args" 更新为适用于C++17的编译器,因为helloworld.cpp使用了C++17中的特性。将当前工作路径("cwd")设置为helloworld.cpp所在的文件夹。 "command" 用于指定用来编译当前源码的程序。在我们这里,"clang++"被用来驱动Clang编译器将我们的代码和C++标准库链接起来。"args" 定义了传递给clang++的命令行参数。这些参数的顺序必须满足编译器对输入参数的顺序的要求。"label" 标志的是你将在任务列表中看到的内容。"problemMatcher" 指定了用来从编译器的输出中寻找error和warning的输出解释器。对于clang++而言,通过"\$gcc"可以获得最佳的输出解释器。"isDefault" 用来设置运行的快捷键。当其值为true时,可以通过⇧+⌘+B 来进行编译。如果设置为false,那么需要通过 Terminal > Run Build Task 来进行编译。

tasks.json中描述的任务是:使用C++编译器编译当前的“active file”,并在当前的文件夹下生成一个和“active file”同名的输出文件。"args"中的“-o”是一个指定输出的开关,后面紧跟着的是输出文件的位置和名字, “${fileDirname}“指的是当前的工作路径,”${fileBasenameNoExtension}” 是“active file”去掉扩展名之后剩下的字符,在这个例子中,也就是“helloworld”。

关于tasks.json,更加详细的描述可以参考一下内容:VS Code 变量参考

编译程序 返回到helloworld.cpp, 因为我们需要使它成为“active file”。运行我们在tasks.json中写好了的任务。使用快捷键⇧+⌘+B 或者 Terminal > Run Build Task 来进行编译。当任务开始以后,你将会在编辑器的下面看到一个集成在VS Code中的终端窗口。当编译结束以后,你将会在终端窗口中看到当前编译是否成功的提示信息。如果编译成功了,你将看到一下信息: 在这里插入图片描述通过终端窗口工具栏上的 + 创建一个新的终端窗口。新创建的终端窗口的工作路径应该和当前的工作路径时一致的。运行ls,你将会看到一个名为helloworld的可执行文件,以及一个名为helloworld.dSYM的调试文件。 在这里插入图片描述运行可执行程序: ./helloworld 改进 tasks.json 如果你需要同时编译多个文件,可以将args中的${file}改为"${workspaceFolder}/*.cpp"。如果你想修改输出可执行文件的名字,只需将"${fileDirname}/${fileBasenameNoExtension}"改为你想要的文件名字即可。 调试 helloworld.cpp

接下来,你将创建launch.json文件来配置LLDB 调试器。F5为启动调试的快捷键。 从菜单栏选择 Run > Add Configuration… ,然后从下滑的选项栏中选择 clang++ build and debug active file 。 在这里插入图片描述 你将会看到一个类似于以下文件的launch.json:

{ // Use IntelliSense to learn about possible attributes. // Hover to view descriptions of existing attributes. // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 "version": "0.2.0", "configurations": [ { "name": "clang++ - Build and debug active file", "type": "cppdbg", "request": "launch", "program": "${fileDirname}/${fileBasenameNoExtension}", "args": [], "stopAtEntry": true, "cwd": "${workspaceFolder}", "environment": [], "externalConsole": false, "MIMode": "lldb", "preLaunchTask": "clang++ build active file" } ] } "program"用来指定你想要调试的程序。在上面的文件中,"program"的值被设置为tasks.json中定义的输出文件的名字。“stopAtEntry”如果设置为false,那么C++插件不会在源码中自动添加任何的断点。如果将“stopAtEntry”设置为true,调试器将在进入main()函数的时候停下来,也就是在程序的最开始处自动设置一个断点。"preLaunchTask"需要保证设置为和tasks.json中label一样的值。 开始调试 回到helloworld.cpp, 确保其当前为“active file”。点击F5,或者选择 Run > Start Debugging 启动调试。在开始调试之前,我们可以先看看当前VS Code的界面主要发生了哪些变化: 下端的终端窗口的DEBUG CONSOLE可以看到开始调试的输出;编辑器中,main函数的第一行被高亮。左侧的Run View 显示了调试的信息在编辑器的上方,出现了一个用于控制调试过程的面板。调试面板的位置是可以随意拖动的。 在这里插入图片描述 跨步调试

现在,可以开始一步步调试代码了!

点击调试面板上的“Step Over”,可以看到for (const string& word : msg)被高亮了。 在这里插入图片描述 “Step Over”会跳过当前的行调用的函数内部的细节。可以注意到,左侧的VARIABLES tab的内容发生了变化,这时msg这个变量已经被创建并初始化了。继续点击“Step Over”,这时进入循环内部,左侧的VARIABLES tab显示了循环内部的变量。继续点击“Step Over”,执行cout。可以看到在DEBUG CONSOLE出现了新的输出。 设置一个监视器(WATCH)

当你需要一直监测某一个变量时时,可以通过设置一个监视器来实现。

在编辑窗口中,将插入光标停在循环内部,然后在左侧的WATCH tab中点击 + (当光标悬停在WATCH的标题栏上时,右侧会出现相关选项),然后在输入框中输入需要监测的变量的名字,例如word。 在这里插入图片描述

想要快速查看被监测的变量的值时,可以将光标悬停在监测变量的上方(WATCH tab内)。 在这里插入图片描述

配置C/C++

C/C++ 插件提供了更多更加自由的配置选项,例如,设置编译器的路径,库的头文件的位置等等。这些配置需要通过编写c_cpp_properties.json来实现。c_cpp_properties.json的编写可以通过图形界面来实现自动生成。点击⇧+⌘+P唤出命令面板,输入C/C++,然后选择 C/C++: Edit Configurations (UI) 。 在这里插入图片描述 点击之后,会打开配置页面,然后根据需要修改相关配置即可: 在这里插入图片描述 自动生成的c_cpp_properties.json文件在.vscode文件夹下。打开之后,可以看到和下面类似的内容:

{ "configurations": [ { "name": "Mac", "includePath": ["${workspaceFolder}/**"], "defines": [], "macFrameworkPath": [ "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks" ], "compilerPath": "/usr/bin/clang", "cStandard": "c11", "cppStandard": "c++17", "intelliSenseMode": "clang-x64" } ], "version": 4 }

通常来讲,这个文件只有在当你需要使用标准库以外的库时需要修改"includePath"。有些情况下,也有可能找到标准库,这时也需要手动修改(个人经验)。 这时可以参考这篇博客.

compilerPath : 这是很重要的设置,因为C/C++插件将根据这个路径去寻找到标准库的头文件。而只有当C/C++插件可以找到标准库的头文件时,自动补全等功能才能正常使用。C/C++插件对compilerPath的默认设置是根据它在你的系统中搜索到的编译器的路径来决定的。C/C++插件的搜索顺序是:

PATH 中制定的编译器硬编码的 Xcode的路径, 例如:/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/

macFrameworkPath : 在C/C++插件的配置页面,展开最下面的“Advanced Settings”,确保macFrameworkPath 指向系统的头文件,例如:/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks

笔者的环境下没有安装这个,也许这是出现找不到标准库头文件的原因。不过我安装了Xcode,所以可以使用:/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/System/Library/Frameworks

可能出现的问题 常见的问题是:undefined _main 或者 attempting to link with file built for unknown-unsupported file format。这个往往是因为编译的时候helloworld.cpp不是“active file”导致的。如果你的错误提示中出现“C++11 extensions”, 你可能需要更新你的tasks.json, 将args中的clang++ 参数修改为--std=c++17, 因为默认情况下,clang++ 使用的是C++98;


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3